/*
题目: 二叉树中的最长交错路径
给你一棵以 root 为根的二叉树，二叉树中的交错路径定义如下：

    选择二叉树中 任意 节点和一个方向（左或者右）。
    如果前进方向为右，那么移动到当前节点的的右子节点，否则移动到它的左子节点。
    改变前进方向：左变右或者右变左。
    重复第二步和第三步，直到你在树中无法继续移动。

交错路径的长度定义为：访问过的节点数目 - 1（单个节点的路径长度为 0 ）。

请你返回给定树中最长 交错路径 的长度。

https://leetcode.cn/problems/longest-zigzag-path-in-a-binary-tree
 */
public class LongestZigZag {
    int maxPath = 0;
    public int longestZigZag(TreeNode root) {
        // 通过 传参的形式 得知前面经过了多少个结点
        DFS(root.left, false, 1);
        DFS(root.right, true, 1);

        return maxPath;
    }

    private void DFS(TreeNode root, boolean isLeft, int path) {
        if (root == null)
            return ;
        maxPath = Math.max(maxPath, path);

        if (isLeft) {
            // 正常前进
            DFS(root.left, false, path + 1);
            // 不遵守, 重新开辟道路
            DFS(root.right, true, 1);
        } else { // 轮到右边
            // 按照规矩办事
            DFS(root.right, true, path + 1);
            // 不遵守, 重新开辟道路
            DFS(root.left, false, 1);
        }
    }
}
